package com.huawei.weather.service;

import com.huawei.weather.config.Constant;
import com.huawei.weather.domain.WeatherResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class WeatherServiceImpl implements WeatherService{

    @Autowired
    RestTemplate restTemplate;  //一定要先配置再使用
    @Autowired
    RedisTemplate redisTemplate;


    @Override
    public WeatherResponse queryWeatherByApi(String cityId) {
        System.out.println("快点看呀，又花钱啦。。。。。。。。。。。。。。。。。。。。。。");
        //https://apis.tianapi.com/tianqi/index?key=你的APIKEY&city=101020100&type=7
        WeatherResponse weatherResponse=restTemplate.getForObject(Constant.WEATHER_API+"key="+Constant.KEY+"&city="+cityId+"&type="+Constant.QUERY_TYPE,WeatherResponse.class);

        return weatherResponse;
    }

    @Override  //不用花冤枉钱，从缓存中查询天气数据
    public WeatherResponse findWeatherByCityId(String cityId) {

        WeatherResponse weatherResponse=null;
        //1.从缓存中查
        weatherResponse=(WeatherResponse)redisTemplate.opsForHash().get(Constant.WEATHER_TABLE_NAME,cityId);

        //2.缓存中没有访问第三方接口
        //  ||||||||||||。。。。。。。。。。。。。。。。。。。。。。。。
        if(weatherResponse==null){  //不妙：  是null   解决方案：双重检查
            synchronized (this){   // 1|  2|  3|    4| 。。。。。10000
                //第二个用户此时再次查询redis缓存，发现有数据了，不用调用第三方接口了
                weatherResponse=(WeatherResponse)redisTemplate.opsForHash().get(Constant.WEATHER_TABLE_NAME,cityId);
                if(weatherResponse==null){
                    weatherResponse=restTemplate.getForObject(Constant.WEATHER_API+"key="+Constant.KEY+"&city="+cityId+"&type="+Constant.QUERY_TYPE,WeatherResponse.class);
                    //记得往缓存中放
                    redisTemplate.opsForHash().put(Constant.WEATHER_TABLE_NAME,cityId,weatherResponse);
                }
            }
        }



        return weatherResponse;
    }
}
